“我裝了防火墻,密碼也設(shè)得很復(fù)雜,怎么還是被入侵了?”——這是很多運維人員的困惑。實際上,Linux系統(tǒng)的安全是“縱深防御”,僅靠一個密碼或一道防火墻遠遠不夠。一個合格的生產(chǎn)環(huán)境,至少需要做到:網(wǎng)絡(luò)層過濾(防火墻)、進程層強制訪問控制(SELinux)、用戶層最小權(quán)限(sudo)、文件層完整性校驗(AIDE)、行為層審計(auditd)和攻擊層阻斷(Fail2ban)。
以RHEL 9.4、Rocky Linux 9和AlmaLinux 9等2026年主流企業(yè)級發(fā)行版為例,從實戰(zhàn)角度講解如何一步步加固Linux系統(tǒng)。所有命令均在生產(chǎn)環(huán)境驗證,建議按順序執(zhí)行。
firewalld是RHEL 7+默認(rèn)的動態(tài)防火墻管理器,支持運行時區(qū)和規(guī)則的動態(tài)修改,無需重啟服務(wù),且規(guī)則持久化。它比iptables更適合生產(chǎn)環(huán)境。
首先確認(rèn)firewalld已安裝并啟動:
bash
systemctl enable firewalld --now systemctl status firewalld
查看當(dāng)前默認(rèn)區(qū)域(通常是public):
bash
firewall-cmd --get-default-zone
實戰(zhàn)原則:默認(rèn)拒絕一切,按需開放端口。
bash
# 設(shè)置默認(rèn)區(qū)域為public,并禁止所有入站流量(保留ssh已允許) firewall-cmd --set-default-zone=public firewall-cmd --zone=public --remove-service=ssh # 先移除默認(rèn)允許的ssh,后面再單獨加
bash
# 允許SSH(建議更改端口號前先允許新端口) firewall-cmd --zone=public --add-port=22/tcp --permanent # 允許HTTP/HTTPS firewall-cmd --zone=public --add-service=http --add-service=https --permanent # 如果運行了數(shù)據(jù)庫(如MySQL,建議只允許內(nèi)網(wǎng)訪問,此處示例僅允許特定IP) firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept' --permanent
重要:永遠不要直接開放數(shù)據(jù)庫端口到公網(wǎng)。
bash
# 僅允許公司IP段訪問22端口 firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" port protocol="tcp" port="22" accept' --permanent
bash
# 限制單個IP的連接數(shù)(防止DoS,需使用direct接口) firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m state --state NEW -m recent --set firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
重載使生效:
bash
firewall-cmd --reload
查看當(dāng)前規(guī)則:
bash
firewall-cmd --list-all
很多管理員一見到SELinux就“setenforce 0”關(guān)掉,這是極大的安全隱患。SELinux(Security-Enhanced Linux)是內(nèi)核級強制訪問控制,即使進程以root運行,也無法違反策略。生產(chǎn)環(huán)境建議保持Enforcing模式。
bash
getenforce # 顯示Enforcing、Permissive或Disabled
若當(dāng)前為Permissive(只記錄不阻斷),改為Enforcing:
bash
setenforce 1 sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
假設(shè)Nginx需要綁定非標(biāo)準(zhǔn)端口(如8080),SELinux會阻止。解決方法:
bash
# 查看SELinux允許的http端口 semanage port -l | grep http # 添加8080到http_port_t semanage port -a -t http_port_t -p tcp 8080
當(dāng)移動網(wǎng)站目錄后,Nginx可能因SELinux無法讀取文件?;謴?fù)上下文:
bash
restorecon -Rv /var/www/html/
若需永久修改上下文:
bash
semanage fcontext -a -t httpd_sys_content_t "/newpath(/.*)?" restorecon -Rv /newpath
某些服務(wù)需要特定布爾值,比如httpd允許訪問網(wǎng)絡(luò):
bash
setsebool -P httpd_can_network_connect on
當(dāng)服務(wù)被SELinux阻斷時,查看/var/log/audit/audit.log,使用:
bash
audit2why < /var/log/audit/audit.log
它會給出友好的解決方案建議。
bash
# 創(chuàng)建普通用戶并設(shè)置密碼 useradd deploy passwd deploy # 禁止root SSH登錄 echo "PermitRootLogin no" >> /etc/ssh/sshd_config systemctl restart sshd
原則:用戶只能執(zhí)行必要的命令,而不是ALL。
編輯/etc/sudoers(使用visudo):
bash
visudo
示例:允許deploy用戶重啟nginx和查看日志,但不能做其他操作:
text
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/journalctl -u nginx -n 50
bash
passwd -l games passwd -l nobody # 注意:某些服務(wù)依賴nobody,謹(jǐn)慎鎖定
bash
# 生成密鑰對(客戶端) ssh-keygen -t ed25519 -C "deploy@your-server" # 將公鑰上傳到服務(wù)器 ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@server_ip # 服務(wù)器上禁用密碼登錄 echo "PasswordAuthentication no" >> /etc/ssh/sshd_config systemctl restart sshd
AIDE(Advanced Intrusion Detection Environment)創(chuàng)建系統(tǒng)文件數(shù)據(jù)庫,定期對比發(fā)現(xiàn)被篡改的文件。
bash
dnf install aide -y
編輯配置/etc/aide.conf,選擇需要監(jiān)控的目錄(默認(rèn)已包含/bin, /sbin, /etc等關(guān)鍵路徑)。
初始化數(shù)據(jù)庫:
bash
aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
bash
cat > /etc/cron.daily/aide-check <<EOF #!/bin/bash aide --check | mail -s "AIDE Daily Report" admin@yourdomain.com EOF chmod +x /etc/cron.daily/aide-check
若有文件被篡改,報告中會顯示“changed”。結(jié)合auditd日志進一步調(diào)查。
auditd可記錄系統(tǒng)調(diào)用、文件訪問、用戶操作等,用于事后溯源和實時告警。
bash
dnf install audit -y systemctl enable auditd --now
編輯/etc/audit/rules.d/audit.rules:
bash
# 監(jiān)控/etc/passwd和/etc/shadow的修改 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity # 監(jiān)控sudo執(zhí)行 -w /usr/bin/sudo -p x -k sudo_exec # 監(jiān)控SSH配置文件 -w /etc/ssh/sshd_config -p wa -k sshd_config # 記錄所有對/var/www/html的寫操作 -w /var/www/html -p wa -k web_content
加載規(guī)則:
bash
augenrules --load systemctl restart auditd
bash
# 查看所有與identity標(biāo)簽相關(guān)的記錄 ausearch -k identity # 查看今天所有失敗的登錄嘗試 ausearch -m USER_LOGIN -sv no
可安裝swatch或自寫腳本監(jiān)控audit.log并發(fā)送郵件。
Fail2ban掃描日志文件,對多次失敗的IP進行動態(tài)封禁(通過防火墻或iptables)。
bash
dnf install epel-release -y dnf install fail2ban -y
創(chuàng)建本地配置文件/etc/fail2ban/jail.local:
ini
[DEFAULT] bantime = 3600 # 封禁1小時 findtime = 600 # 10分鐘內(nèi) maxretry = 5 # 失敗5次觸發(fā) [sshd] enabled = true port = ssh logpath = %(sshd_log)s backend = systemd
若SSH更改了端口,修改port值。
bash
systemctl enable fail2ban --now
bash
fail2ban-client status sshd
bash
fail2ban-client set sshd unbanip 192.168.1.100
將以上檢查項整合為每日巡檢腳本,輸出報告:
bash
#!/bin/bash echo "=== Firewall Rules ===" firewall-cmd --list-all echo -e "\\n=== SELinux Status ===" getenforce echo -e "\\n=== Failed SSH Attempts (last 24h) ===" journalctl _SYSTEMD_UNIT=sshd.service --since "24 hours ago" | grep "Failed password" | wc -l echo -e "\\n=== AIDE Check (last run) ===" tail -1 /var/log/aide/aide.log echo -e "\\n=== Auditd Recent Events ===" ausearch -ts today | head -20
將此腳本加入cron,每天發(fā)送給管理員。
Linux安全加固不是一次性的工作,而是持續(xù)的過程。記?。?strong>沒有絕對的安全,只有相對的安全。保持警惕,持續(xù)改進。
手機: +86 13923405632
